Skip to content

[pull] main from expo:main#960

Merged
pull[bot] merged 12 commits into
code:mainfrom
expo:main
Jun 12, 2026
Merged

[pull] main from expo:main#960
pull[bot] merged 12 commits into
code:mainfrom
expo:main

Conversation

@pull

@pull pull Bot commented Jun 12, 2026

Copy link
Copy Markdown

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

Wenszel and others added 12 commits June 12, 2026 12:37
# Why

Follow-up to #45531

This PR introduces a new TS layer structure with an emphasis on decoupling native types (used in `requireNativeModule`) from the public API types.

The main motivation behind this is that, for example, `NativeAsset` is not the same as `Asset` - the latter exists so we can override certain functions. It was misleading that some functions were marked as if they returned `Asset`, when in reality they returned `NativeAsset`. This mismatch could lead to the `... is not a function` exception. Introducing a clear distinction prevents this exception from occurring, as it forces us to explicitly wrap or override the native type before returning it through the API.
# How

Split the existing TS files into 3 distinct directories to enforce separation of concerns:

- `types` - stores shared types used by both the native and JS layers.
- `js` - stores classes and functions exported as the public API.
- `native` - stores types that strictly correspond to the native layer.

Each of these directories includes an `index.ts` file to maintain clean boundaries (e.g., the native layer imports strictly from `../types` and has no knowledge of the internal JS layer files).
# Test Plan
BareExpo
…46799)

# Why

`expo-widgets` depends on the `expo` module, so any use of
`UIApplication.shared` needs to be guarded.
```
'shared' is unavailable in application extensions for iOS: Use view controller based solutions where appropriate instead.
```

# How

Add `@available(iOSApplicationExtension, unavailable)` to
`ExpoAppSceneDelegate`.

# Test Plan

Build the app with `expo-widgets`.

# Checklist

- [x] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
# Why

Update react-native-gesture-handler to 2.32.0 (react-native 0.86.0
support), drop patch files.

# How

- Bump react-native-gesture-handler to 2.32.0

# Test Plan

- bare-expo and minimal-tester are building / running

# Checklist

<!--
Please check the appropriate items below if they apply to your diff.
-->

- [ ] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [ ] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
…ysical devices (#46851)

# Why

The shadow node placement of the button in page does not match with the
compose pager's placed view. When user taps the button, we receive e.g.
x = 0, y = 100 from native, RN (Shadow node) thinks the button is at x =
0, y = 800 and it cancels the press in
[onResponderMove](https://github.com/react/react-native/blob/d8f71837f8db1b9bdd3be7c7df0d5b5c476e4bac/packages/react-native/Libraries/Pressability/Pressability.js#L510).
#46778 fixed the issue for emulator as the event never makes to
`onResponderMove` 😅.

# How

Place pages absolutely so compose pager view's placement matches shadow
node's placement.

# Test Plan

Manual, on a physical Android device: a `community/pager-view` with a
`Pressable`/`Button` on each page; navigate to page 2+ and tap. The
button now fires (was dead on device before, worked only on the
emulator). Verified together with the `pointerEvents` gating from
#46778.
# Why
The `spotless apply` step used to run during `android-unit-test` on
`expo-go` but was removed in this PR:
#46729

# How 
Adds the `spotless apply` step which is executed in
`apps/bare-expo/android`. Also, fixed existing lint errors.

# Test Plan
Green CI ✅
# Why

The brownfield iOS e2e job started failing with an empty device id
(`simctl install <empty> ...` dumps usage and the launch fails). The
simulator lookup in `setup-simulator.sh` hardcoded the runtime match to
`iOS-26-2`, so when CI moved to iOS 26.4 no device matched and
`DEVICE_ID` was never set.

# How

- Drop the hardcoded minor-version suffix in the jq runtime filter so
any `iOS-26-x` runtime matches.
- Make `run-e2e-ios.sh` exit with a clear error when `start_simulator`
fails or `DEVICE_ID` is empty, instead of silently falling through to
the confusing `simctl` usage output.

# Test Plan

Re-run the brownfield `ios` e2e job: the `iPhone 17 Pro` / iOS 26.4
simulator is found and booted, the app installs and launches, and
Maestro flows run.

# Checklist

- [ ] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [ ] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
@pull pull Bot locked and limited conversation to collaborators Jun 12, 2026
@pull pull Bot added the ⤵️ pull label Jun 12, 2026
@pull pull Bot merged commit ef456dd into code:main Jun 12, 2026
27 checks passed
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

10 participants